﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

//struct Stu
//{
//	char name[20];//名字 
//	int age;//年龄 
//	char sex[5];//性别 
//	char id[20];//学号 
//}; //分号不能丢 
//
//int main()
//{
//	//按照结构体成员的顺序初始化 
//	struct Stu s = { "张三", 20, "男", "20230818001" };
//	printf("name: %s\n", s.name);
//	printf("age : %d\n", s.age);
//	printf("sex : %s\n", s.sex);
//	printf("id : %s\n", s.id);
//
//	//按照指定的顺序初始化 
//	struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex =
//   "女" };
//	printf("name: %s\n", s2.name);
//	printf("age : %d\n", s2.age);
//	printf("sex : %s\n", s2.sex);
//	printf("id : %s\n", s2.id);
//	return 0;
//}


//匿名结构体类型
//struct
//{
//	int a;
//	char b;
//	float c;
//}x;
//
//struct
//{
//	int a;
//	char b;
//	float c;
//}a[20], * p;
//
//int main()
//{
//
//	return 0;
//}

//struct Stu
//{
//	char name[20];
//	int age;
//	float socre;
//}s3, s4;//s3,s4是全局变量

//struct Stu
//{
//	char name[20];
//	int age;
//	float socre;
//};
//
//
//struct Stu s2;//全局变量
//
//int main()
//{
//	struct Stu s1 = {"lisi", 20, 95.5f};//局部
//
//	return 0;
//}

//struct //匿名结构体类型
//{
//	int a;
//	char b;
//	float c;
//}s1;
//
//struct //匿名结构体类型
//{
//	int a;
//	char b;
//	float c;
//}* ps;
//
//int main()
//{
//	
//	ps = &s1;
//	return 0;
//}

//struct Node
//{
//	int data;
//	struct Node* next;
//}Node;

//typedef struct Node
//{
//	int data;
//	struct Node* next;
//} Node;
//
//int main()
//{
//	printf("%zd\n", sizeof(struct Node));
//	return 0;
//}

//struct
//{
//	char arr[20];
//	int age;
//	double score;
//}s1;
//
//int main()
//{
//	struct  s2 = { "lisi",20,99.5 };
//
//	return 0;
//}

//struct //匿名结构体类型  -->  只能用一次
//{
//	char arr[20];
//	int age;
//	double score;
//}s ,* ps;
//
//
//int main()
//{
//	ps = &s;
//
//	return 0;
//}

//struct node
//{
//	int data;
//	struct node next;
//}node;
//
//int main()
//{
//	printf("%zd\n", sizeof(struct node));
//	return 0;
//}

//struct node
//{
//	int data;
//	struct node* next;
//}node;
//
//int main()
//{
//	printf("%zd\n", sizeof(struct node));
//	return 0;
//}


//typedef struct node
//{
//	int data;
//	struct node* next;
//}node;
//
//int main()
//{
//	printf("%zd\n", sizeof(struct node));
//	return 0;
//}


//struct
//{
//	int a;
//	char b;
//	float c;
//};
//
//int main()
//{
//
//	return 0;
//}

//struct s1
//{
//	char a;//1
//	char b;//1
//	int c;//4
//};
//
//struct s2
//{
//	char a;//1
//	int c;//4
//	char b;//2
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct s1));//8
//	printf("%zd\n", sizeof(struct s2));//12
//
//	return 0;
//}

//练习1 
//struct S1
//{
//	char c1;//1
//	int i;//4
//	char c2;//1
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S1));//12
//
//	return 0;
//}
//练习2 
//struct S2
//{
//	char c1;//1
//	char c2;//1
//	int i;//4
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S2));//8
//
//	return 0;
//}
//
////练习3 
//struct S3
//{
//	double d;//8
//	char c;//1
//	int i;//4
//};
//int main()
//{
//	printf("%zd\n", sizeof(struct S3));//16
//
//
//	return 0;
//}
//
//
////练习4-结构体嵌套问题 
//struct S4
//{
//	char c1;//1
//	struct S3 s3;//16
//	double d;//8
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct S4));//32
//	return 0;
//
//}

//#include <stddef.h>
//
//struct S1
//{
//	char c1;//1
//	char c2;//1
//	int n;//4
//};
//
//struct S2
//{
//	char c1;//1
//	int n;//4
//	char c2;//1
//};
//
//int main()
//{
//	//struct S2 s2;
//	printf("%zd\n", offsetof(struct S2, c1));
//	printf("%zd\n", offsetof(struct S2, n));
//	printf("%zd\n", offsetof(struct S2, c2));
//
//	//printf("%zd\n", sizeof(struct S1));//?
//	//printf("%zd\n", sizeof(struct S2));//?
//
//	return 0;
//}

//#include <stdio.h>
//
//#pragma pack(1)//设置默认对齐数为1
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的对⻬数，还原为默认 
//
//int main()
//{
//	//输出的结果是什么？ 
//	printf("%zd\n", sizeof(struct S));//6
//	return 0;
//}


//struct S
//{
//    int data[1000];
//    int num;
//};
//
//void Print1(struct S t)
//{
//    int i = 0;
//    printf("Print1:");
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", t.data[i]);
//    }
//    printf("%d\n", t.num);
//}
//
//void Print2(const struct S* ps)
//{
//    int i = 0;
//    printf("Print2:");
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", ps->data[i]);//(*ps).data[i]
//    }
//    printf("%d\n", ps->num);
//}

//Print2更好一些，可以节省很大的空间

//int main()
//{
//    struct S s = { {1,2,3,4,5}, 100 };
//    Print1(s);//结构体的传参
//    Print2(&s);
//    return 0;
//}

//struct A
//{
//	int _a : 2;
//	int _b : 5;
//	int _c : 10;
//	int _d : 30;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(struct A));
//
//	return 0;
//}

//⼀个例⼦ 
//struct S
//{
//	char a : 3;
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 12;
//	s.c = 3;
//	s.d = 4;
//
//	return 0;
//}
//空间是如何开辟的？

struct A
{
    int _a : 2;
    int _b : 5;
    int _c : 10;
    int _d : 30;
};

int main()
{
    struct A sa = { 0 };
    //scanf("%d", &sa._b);//这是错误的

    //正确的示范
    int b = 0;
    scanf("%d", &b);
    sa._b = b;
    return 0;
}